package edu.ccut.saturn.component.impl.directory;

import java.util.Enumeration;

import org.osgi.framework.Bundle;

import edu.ccut.saturn.component.ComponentFactory;
import edu.ccut.saturn.component.IBundleComponentInfo;
import edu.ccut.saturn.component.IBundleInfo;
import edu.ccut.saturn.component.SaturnComponentException;

/**
 * logic组件文件夹路径资源的实现类，logic组件文件夹位于bundle的根路径或模块文件夹内部，用于保存logic组件的配置文件。
 * 通过加载方法加载logic组件文件夹内部的logic组件。logic组件配置文件的文件后缀是“.logic”。
 * <p><code>SaturnBaseComponentDirectoryInfo</code>扩展了类<code>AbstractDirectoryInfo</code>。
 * 
 * @author 谷钰
 * @version 1.0 2008.8.29
 * 
 * @see AbstractDirectoryInfo
 * @see IBundleInfo
 * @see ComponentFactory
 * @see IBundleComponentInfo
 * 
 */
//TODO：logic组件的中文名？
public class SaturnLogicDirectoryInfo extends AbstractDirectoryInfo {

	private static final String SATURN_LOGIC_COMPONENT_FILE_POSTFIX = ".logic";

	public SaturnLogicDirectoryInfo() {

		super(SATURN_DIRECTORY_TYPE_LOGIC);
	}

	/**
	 * logic组件文件夹加载内部的logic组件配置文件的方法。
	 * 首先获得文件夹内部的所有的logic组件的访问路径；然后调用<code>ComponentFactory</code>获得logic组件的加载实例，
	 * 并保存到bundle对应的<code>IBundleInfo</code>实例中的<code>IBundleComponentInfo</code>中。
	 * 
	 * @param bundle
	 *            加载的bundle对象实例
	 * @param bundleInfo
	 *            保存bundle的加载信息
	 */
	@SuppressWarnings("unchecked")
	public void load(Bundle bundle, IBundleInfo bundleInfo) {
		Enumeration<String> logicFiles = bundle.getEntryPaths(super
				.getDirectoryPath());

		while (logicFiles.hasMoreElements()) {
			String logicFile = logicFiles.nextElement();

			try {

				if (logicFile != null
						&& logicFile
								.endsWith(SATURN_LOGIC_COMPONENT_FILE_POSTFIX)) {

					bundleInfo.getBundleComopnentInfo().addComponentInfo(
							ComponentFactory.getLogicComponentInfo(bundle,
									logicFile));
				}

			} catch (SaturnComponentException e) {
				logger.error("load logic failed! the file name is \""
						+ logicFile + "\" in bundle ["
						+ bundle.getSymbolicName() + "]", e);
			}
		}
	}
}
